#!/bin/bash

# 增强版godoos安装脚本

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 日志函数
log() {
    echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')] $1${NC}"
}

warn() {
    echo -e "${YELLOW}[警告] $1${NC}"
}

success() {
    echo -e "${GREEN}[成功] $1${NC}"
}

error() {
    echo -e "${RED}[错误] $1${NC}" >&2
}

# 错误处理
die() {
    error "$1"
    read -p "按回车键退出..."
    exit 1
}

# 获取本机IP地址
get_local_ip() {
    local ip
    ip=$(ip -o -4 addr show scope global | awk '{print $4}' | cut -d'/' -f1 | head -n1)
    
    if [ -z "$ip" ]; then
        ip=$(hostname -I | awk '{print $1}')
    fi
    
    echo "$ip"
}

# 精准系统检测
detect_system() {
    # 检测群辉DSM
    if [ -f /etc/synoinfo.conf ] && [ -d /var/packages ]; then
        echo "dsm"
        return
    fi

    # 检测FNOS系统
    if grep -q "ID=debian" /etc/os-release && ls /vol1* &>/dev/null; then
        echo "fnos"
        return
    fi

    # 检测Ubuntu系统
    if grep -q "ID=ubuntu" /etc/os-release; then
        echo "ubuntu"
        return
    fi

    # 检测CentOS/RHEL系统
    if grep -q "ID=\"centos\"" /etc/os-release || grep -q "ID=\"rhel\"" /etc/os-release; then
        echo "centos"
        return
    fi

    # 检测其他Debian系统
    if grep -q "ID=debian" /etc/os-release; then
        echo "debian"
        return
    fi

    # 其他Linux系统
    if [ -f /etc/os-release ]; then
        echo "linux"
        return
    fi

    echo "unknown"
}

# 获取可用磁盘空间
get_available_space() {
    local dir="$1"
    df -h "$dir" | awk 'NR==2 {print $4}'
}

# 获取Docker目录
get_docker_dir() {
    local system_type=$1
    local dir=""
    local default_dir=""

    case $system_type in
        "dsm")
            default_dir="/volume1/docker"
            dir=$(find /volume* -maxdepth 1 -type d -name "docker" 2>/dev/null | head -n1)
            ;;
        "fnos")
            default_dir="/vol1/1000/docker"
            dir=$(find /vol*/1000 -maxdepth 1 -type d -name "docker" 2>/dev/null | head -n1)
            ;;
        "ubuntu"|"debian")
            default_dir="/opt/docker"
            dir="/opt/docker"
            ;;
        "centos")
            default_dir="/opt/docker"
            dir="/opt/docker"
            ;;
        *)
            default_dir="/opt/docker"
            dir="/opt/docker"
            ;;
    esac

    [ -z "$dir" ] && dir="$default_dir"
    
    # 清理路径中的特殊字符
    dir=$(echo "$dir" | tr -d '\n\r' | sed 's/[[:space:]]*$//')
    
    # 创建目录（如果不存在）
    mkdir -p "$dir" || die "无法创建目录 $dir"
    
    echo "$dir"
}

# 验证端口是否可用
is_port_available() {
    local port=$1
    if ! ss -tuln | grep -q ":${port} "; then
        return 0
    else
        return 1
    fi
}

# 获取映射端口
get_mapped_port() {
    local default_port=6106
    
    while true; do
        read -p "请输入godoos映射端口(默认${default_port}): " port
        port=${port:-$default_port}
        
        # 检查端口是否为数字
        if ! [[ "$port" =~ ^[0-9]+$ ]]; then
            error "端口必须是数字"
            continue
        fi
        
        # 检查端口范围
        if [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
            error "端口必须在1-65535之间"
            continue
        fi
        
        # 检查端口是否被占用
        if ! is_port_available "$port"; then
            warn "端口 $port 已被占用"
            read -p "是否继续使用此端口？(y/N): " choice
            if [[ "$choice" =~ ^[Yy]$ ]]; then
                break
            else
                continue
            fi
        fi
        
        break
    done
    
    echo "$port"
}

# 检查Docker服务状态
check_docker_service() {
    log "检查Docker服务状态..."
    if ! docker ps -a >/dev/null 2>&1; then
        error "Docker服务异常，无法执行docker命令"
        
        # 尝试自动启动Docker服务（如果systemctl可用）
        if command -v systemctl >/dev/null 2>&1; then
            warn "尝试启动Docker服务..."
            if sudo systemctl start docker; then
                sleep 3
                if docker ps -a >/dev/null 2>&1; then
                    success "Docker服务启动成功"
                    return
                fi
            fi
        fi
        
        die "请确保Docker已正确安装并运行。可以尝试手动执行: sudo systemctl start docker 或重启Docker服务"
    fi
    success "Docker服务正常"
}

# 清理旧容器和镜像
cleanup_old_containers() {
    log "检查并清理旧版本godoos容器..."
    
    # 停止并删除所有名为godoos的容器
    if docker ps -aq --filter "name=godoos" | grep -q .; then
        log "发现旧版godoos容器，正在停止和删除..."
        docker stop godoos >/dev/null 2>&1
        docker rm godoos >/dev/null 2>&1
        success "旧版godoos容器已删除"
    else
        log "未发现旧版godoos容器"
    fi
    
    # 可选：清理旧的godoos镜像（保留最新版本）
    local old_images
    old_images=$(docker images godoos/godoos --filter "before=godoos/godoos:latest" --format "{{.ID}}" 2>/dev/null)
    
    if [ -n "$old_images" ]; then
        log "清理旧版godoos镜像..."
        docker rmi $old_images >/dev/null 2>&1 || warn "清理旧镜像失败，可能正在被使用"
    fi
}

# 拉取Docker镜像
pull_docker_image() {
    log "正在拉取godoos镜像..."
    if ! docker pull godoos/godoos:latest; then
        warn "镜像拉取失败，尝试使用本地镜像启动..."
        return 1
    fi
    success "镜像拉取完成"
}

# 安装godoos
install_godoos() {
    local base_dir="$1"
    local data_dir="${base_dir}/godoos"
    local port=$(get_mapped_port)
    
    # 创建数据目录
    data_dir=$(echo "$data_dir" | tr -d '\n\r' | sed 's/[[:space:]]*$//')
    mkdir -p "$data_dir" || die "无法创建godoos数据目录: $data_dir"
    
    # 设置目录权限
    if ! chmod 777 "$data_dir" 2>/dev/null; then
        warn "无法设置目录权限，尝试使用sudo..."
        sudo chmod 777 "$data_dir" || warn "目录权限设置失败，继续安装..."
    fi

    local available_space=$(get_available_space "$data_dir")
    
    log "=== 安装信息汇总 ==="
    log "系统类型: $(detect_system)"
    log "Docker目录: ${base_dir}"
    log "数据目录: ${data_dir}"
    log "映射端口: ${port} -> 56780"
    log "可用空间: ${available_space}"
    log "===================="

    # 清理旧容器和镜像
    cleanup_old_containers

    # 拉取镜像
    pull_docker_image

    # 运行新容器
    log "正在启动godoos容器..."
    if ! docker run -d \
        --name=godoos \
        -v "${data_dir}:/root/.godoos/os" \
        -p "${port}:56780" \
        --restart=always \
        godoos/godoos:latest; then
        
        docker logs godoos 2>&1 | head -n 30
        die "启动godoos容器失败"
    fi

    # 验证容器状态
    log "检查容器状态..."
    for i in {1..10}; do
        if docker ps --filter "name=godoos" --format "table {{.Names}}\t{{.Status}}" | grep -q "Up"; then
            break
        fi
        sleep 2
    done

    if ! docker ps --filter "name=godoos" --format "table {{.Names}}\t{{.Status}}" | grep -q "Up"; then
        error "容器启动失败，查看日志..."
        docker logs godoos
        die "容器启动后异常退出"
    fi

    local ip=$(get_local_ip)
    success "========== 安装成功 =========="
    echo -e "访问地址: ${CYAN}http://${ip}:${port}${NC}"
    echo -e "本地访问: ${CYAN}http://127.0.0.1:${port}${NC}"
    echo -e "数据目录: ${data_dir}"
    echo -e "容器端口: 56780"
    echo -e "查看日志: ${YELLOW}docker logs -f godoos${NC}"
    echo -e "停止服务: ${YELLOW}docker stop godoos${NC}"
    echo -e "重启服务: ${YELLOW}docker restart godoos${NC}"
    
    # 测试连接
    log "测试服务连接..."
    sleep 5
    if curl -s "http://127.0.0.1:${port}" >/dev/null; then
        success "服务连接测试成功"
    else
        warn "服务连接测试失败，但容器正在运行，请稍后重试"
    fi
}

# 显示系统信息
show_system_info() {
    log "系统信息:"
    echo -e "主机名: $(hostname)"
    echo -e "系统类型: $(detect_system)"
    echo -e "IP地址: $(get_local_ip)"
    echo -e "Docker版本: $(docker --version 2>/dev/null | cut -d ',' -f 1 || echo '未安装')"
    echo
}

# 主流程
main() {
    echo -e "${CYAN}=== godoos自动化安装脚本 ===${NC}"
    echo
    
    # 显示系统信息
    show_system_info
    
    # 检查Docker
    if ! command -v docker &>/dev/null; then
        die "Docker未安装，请先安装Docker"
    fi
    
    # 检查Docker服务状态
    check_docker_service
    
    success "Docker已安装: $(docker --version | cut -d ',' -f 1)"

    # 检测系统并获取目录
    system_type=$(detect_system)
    case $system_type in
        "dsm") success "检测到群辉DSM系统" ;;
        "fnos") success "检测到FNOS系统" ;;
        "ubuntu") success "检测到Ubuntu系统" ;;
        "debian") success "检测到Debian系统" ;;
        "centos") success "检测到CentOS/RHEL系统" ;;
        "linux") warn "检测到通用Linux系统" ;;
        *) warn "系统类型未知，使用默认配置" ;;
    esac

    dir=$(get_docker_dir "$system_type")
    log "使用容器目录: ${dir}"

    # 安装godoos
    install_godoos "$dir"

    echo
    read -p "按回车键退出..."
}

main "$@"